package bomberman.util;

import java.awt.Rectangle;

import bomberman.model.Bom;
import bomberman.model.Enemy;
import bomberman.model.Flame;
import bomberman.model.Property;
import bomberman.swing.BomJPanel;

public class CommonTouch {

	/**
	 * 检测玩家、火焰、敌人是否和窗体边界碰撞
	 * @return
	 */
	public static boolean checkIfTouchBorder(int x, int y){
		// 上
		if(y < 0){
			return true;
		}
		// 下
		if((y + 30) > GameMap.map.length * 30){
			return true;
		}
		// 左
		if(x < 0){
			return true;
		}
		// 右
		if((x + 30) > GameMap.map[0].length * 30){
			return true;
		}
		return false;
	}
	
	
	/**
	 * 检测玩家，敌人是否和石头的碰撞
	 * @return
	 */
	public static boolean checkIfTouchStone(int x, int y){
		// 左上角(x, y)
		if (GameMap.map[y / 30][x / 30] == GameMap.ele_stone) {
			return true;
		}
		// 左下角(x, y+30)
		if ((y + 30) % 30 != 0
				&& (GameMap.map[(y + 30) / 30][x / 30] == GameMap.ele_stone)) {
			return true;
		}
		// 右上角(x+30, y)
		if ((x + 30) % 30 != 0
				&& (GameMap.map[y / 30][(x + 30) / 30] == GameMap.ele_stone)) {
			return true;
		}
		// 右下角(x+30, y+30)
		if ((y + 30) % 30 != 0 && (x + 30) % 30 != 0
				&& (GameMap.map[(y + 30) / 30][(x + 30) / 30] == GameMap.ele_stone)) {
			return true;
		}
		return false;
	}
	
	
	/**
	 * 检测玩家，敌人和砖头的碰撞
	 * @return
	 */
	public static boolean checkIfTouchWall(int x, int y){
		// 左上角(x, y)
		if (GameMap.map[y / 30][x / 30] == GameMap.ele_wall) {
			return true;
		}
		// 左下角(x, y+30)
		if ((y + 30) % 30 != 0
				&& GameMap.map[(y + 30) / 30][x / 30] == GameMap.ele_wall) {
			return true;
		}
		// 右上角(x+30, y)
		if ((x + 30) % 30 != 0
				&& GameMap.map[y / 30][(x + 30) / 30] == GameMap.ele_wall) {
			return true;
		}
		// 右下角(x+30, y+30)
		if ((y + 30) % 30 != 0 && (x + 30) % 30 != 0
				&& GameMap.map[(y + 30) / 30][(x + 30) / 30] == GameMap.ele_wall) {
			return true;
		}
		return false;
	}
	
	
	/**
	 * 检测玩家和炸弹的碰撞
	 * 检测8个点，若只要有一个点不再边界且在障碍物内，则返回false
	 * @return
	 */
	public static boolean checkIfTouchBom(int x, int y){
		
		// 玩家矩形
		Rectangle man_rect = new Rectangle(x, y, 30, 30);
		
		// temp_bounds不为空，代表刚刚放置了炸弹，则需要判断人物是否移动出炸弹位置
		int xx = 0, yy = 0;
		if(!"".equals(BomJPanel.temp_bounds)){
			
			// 炸弹坐标
			xx = Integer.parseInt(BomJPanel.temp_bounds.split(",")[0]);
			yy = Integer.parseInt(BomJPanel.temp_bounds.split(",")[1]);
			
			// 若人物移出炸弹位置，则将炸弹坐标添加进bom_bounds_sets，并清空temp_bounds
			if(! checkIfManTouchBom(man_rect, new Rectangle(xx, yy, 30, 30))){
				BomJPanel.bom_bounds_sets.add(xx + "," + yy);
				BomJPanel.temp_bounds = "";
			}
		}
		
		// 检测人物是否碰撞炸弹
		if(BomJPanel.boms.size() != 0){
			for(Bom bom : BomJPanel.boms){
				if(! (!"".equals(BomJPanel.temp_bounds) && bom.getX() == xx && bom.getY() == yy)){
					Rectangle bom_rect = new Rectangle(bom.getX(), bom.getY(), 30, 30);
					if(checkIfManTouchBom(man_rect, bom_rect)){
						return true;
					}
				}
			}
		}
		return false;
	}
	
	/**
	 * 检测移动物体和炸弹是否碰撞
	 */
	public static boolean checkIfManTouchBom(Rectangle move_rect, Rectangle bom_rect){
		return move_rect.intersects(bom_rect);
	}
	
	/**
	 * 检测火焰碰撞砖
	 */
	public static boolean checkFlameTouchWall(int x, int y){
		return GameMap.map[y / 30][x / 30] == GameMap.ele_wall;
	}

	/**
	 * 检测火焰碰撞石头
	 */
	public static boolean checkFlameTouchStone(int x, int y){
		return GameMap.map[y / 30][x / 30] == GameMap.ele_stone;
	}
	
	
	/**
	 * 检测火焰和敌人的碰撞
	 */
	public static boolean checkIfFlameTouchEnemy(Flame flame, Enemy enemy){
		return flame.getRect().intersects(enemy.getRect());
	}

	/**
	 * 检测敌人和炸弹的碰撞
	 */
	public static boolean checkIfEnemyTouchBom(int x, int y) {
		for(Bom bom : BomJPanel.boms){
			if(!bom.isBoom()){
				// 只要和炸弹碰撞，就返回true，否则循环完毕返回false
				if(bom.getRect().intersects(new Rectangle(x, y, 30, 30))){
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * 检测炸弹和敌人的碰撞
	 */
	public static boolean checkIfBomTouchEnemy(Bom bom) {
		for(Enemy enemy : BomJPanel.enemys){
			if(enemy.isLive() && !bom.isBoom()){
				// 只要和炸弹碰撞，就返回true，否则循环完毕返回false
				if(bom.getRect().intersects(enemy.getRect())){
					return true;
				}
			}
		}
		return false;
	}
	
	
	/**
	 * 检测玩家是否碰撞道具，当道具中心点被碰撞时，才认为是有效碰撞
	 */
	public static Property checkIfTouchProperty(int x, int y){
		// 玩家矩形
		Rectangle man_rect = new Rectangle(x, y, 30, 30);
		
		// 只检测显示出来的道具
		for (Property p : BomJPanel.properties) {
			if (p.isVisible() && man_rect.contains(p.getX() + 15, p.getY() + 15)) {
				return p;
			}
		}
		return null;
	}
	
}
